package ar.pegasus.webcam;

import java.awt.Component;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.LayoutStyle.ComponentPlacement;

import org.apache.log4j.Logger;

import ar.pegasus.entidades.Foto;
import ar.pegasus.framework.util.DateUtil;
import ar.pegasus.generador.GeneradorXML;
import ar.pegasus.webcam.boss.BossConfiguracionApp;
import ar.pegasus.webcam.util.AppEtiquetasBotones;

/**
 * Ventana principal de la aplicacion de captura de imagenes
 * 
 * @author oarias
 */
public class FrmCapturaImagenComentada extends JFrame implements IFrmCapturaImagen{
	private static final long serialVersionUID = 2768140318291094484L;

	private static Logger logger = Logger.getLogger(FrmCapturaImagenComentada.class);
	// private JButton btnInformacion;
	private JButton btnCapturar,btnCapturarSalir;
	private JButton btnVer, btnCerrar;
	private JMenuBar jMenuBar1;
	private JMenu jMenuDispositivos;
	public JPanel jPWebCam;
	private JPanel jPanel1;
	private JScrollPane jScrollPane;
	private JTextArea txtEpigrafe;
	private JLabel lblEpigrafe;
	
	private Dispositivos misDispositivos;
	protected List<Foto> imagenes;

	public FrmCapturaImagenComentada() {
		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);

		construct();
		imagenes = new ArrayList<Foto>();
		misDispositivos = new Dispositivos(this);
		misDispositivos.detectarDispositivos(jMenuDispositivos);
		activarWebCam();
	}

	private void construct() {
		setTitle("Captura de Fotos - V " + BossConfiguracionApp.getInstance().getNumeroRelease());

		getContentPane().add(getPanelWebCam(), java.awt.BorderLayout.NORTH);
		getContentPane().add(getPanelInfo(), java.awt.BorderLayout.SOUTH);

		setJMenuBar(getMenubar());

		setSize(new java.awt.Dimension(500, 513));
		FrmCapturaImagenComentada.centrar(this);
	}

	private JMenuBar getMenubar() {
		if (jMenuBar1 == null) {
			jMenuBar1 = new JMenuBar();
			jMenuDispositivos = new JMenu();
			jMenuDispositivos.setText(AppEtiquetasBotones.DISPOSITIVOS);
			jMenuBar1.add(jMenuDispositivos);
		}
		return jMenuBar1;
	}

	private JPanel getPanelInfo() {
		if (jPanel1 == null) {
			jPanel1 = new JPanel();
			jPanel1.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
			jPanel1.setPreferredSize(new java.awt.Dimension(430, 160));

			GroupLayout gl_jPanel1 = new GroupLayout(jPanel1);
			gl_jPanel1
					.setHorizontalGroup(gl_jPanel1
							.createParallelGroup(Alignment.CENTER)
							.addGroup(
									gl_jPanel1
											.createSequentialGroup()
											.addContainerGap()
											.addGroup(
													gl_jPanel1
															.createParallelGroup(
																	Alignment.LEADING)
															.addGroup(
																	gl_jPanel1
																			.createSequentialGroup()
																			// .addComponent(getBtnInformacion())
																			.addGap(18)
																			.addComponent(getBtnVer())
																			.addGap(33)
																			.addComponent(getBtnCapturar())
																			.addGap(18)
																			.addComponent(getBtnCapturarSalir())
																			.addGap(18)
																			.addComponent(getBtnCerrar()))
															.addComponent(getPanelEpigrafe(),GroupLayout.DEFAULT_SIZE,412,Short.MAX_VALUE)
															.addComponent(getLblEpigrafe())
													)
											.addContainerGap()));
			gl_jPanel1.setVerticalGroup(gl_jPanel1.createParallelGroup(
					Alignment.TRAILING).addGroup(
					gl_jPanel1
							.createSequentialGroup()
							.addComponent(getLblEpigrafe())
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(getPanelEpigrafe(),GroupLayout.DEFAULT_SIZE, 102,Short.MAX_VALUE)
							.addPreferredGap(ComponentPlacement.UNRELATED)
							.addGroup(
									gl_jPanel1
											.createParallelGroup(
													Alignment.BASELINE)
											.addComponent(getBtnCerrar())
											// .addComponent(getBtnInformacion())
											.addComponent(getBtnVer())
											.addComponent(getBtnCapturar())
											.addComponent(getBtnCapturarSalir())
											)
							.addContainerGap()));

			jPanel1.setLayout(gl_jPanel1);
		}

		return jPanel1;
	}

	private JLabel getLblEpigrafe() {
		if(lblEpigrafe == null){
			lblEpigrafe	= new JLabel("Comentario");
			lblEpigrafe.setFont(new Font("Tahoma", Font.BOLD, 11));
		}
		return lblEpigrafe;
	}

	private Component getPanelEpigrafe() {
		if(jScrollPane == null){
			jScrollPane = new JScrollPane();
			jScrollPane.setViewportView(getTxtEpigrafe());
			
			getLblEpigrafe().setLabelFor(jScrollPane);
		}
		return jScrollPane;
	}

	private JTextArea getTxtEpigrafe() {
		if (txtEpigrafe == null) {
			txtEpigrafe = new JTextArea();
			txtEpigrafe.setColumns(20);
			txtEpigrafe.setRows(5);
		}
		return txtEpigrafe;
	}

	public JPanel getPanelWebCam() {
		if (jPWebCam == null) {
			jPWebCam = new JPanel();
			jPWebCam.setBorder(BorderFactory
					.createTitledBorder("Imagen de la cámara"));
			jPWebCam.setLayout(new java.awt.BorderLayout());

		}
		return jPWebCam;
	}

	public static void centrar(Window window) {
		int x = ((Toolkit.getDefaultToolkit().getScreenSize().width - window.getWidth()) / 2);
		int y = ((Toolkit.getDefaultToolkit().getScreenSize().height - window.getHeight()) / 2);
		window.setLocation(x, y);
	}

	/**
	 * Boton de Cierre de la Aplicacion
	 * 
	 * @return
	 */
	private JButton getBtnCerrar() {
		if (btnCerrar == null) {
			btnCerrar = new JButton();
			btnCerrar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					botonSalirPresionado();
				}
			});
			btnCerrar.setText(AppEtiquetasBotones.SALIR);

		}
		return btnCerrar;
	}

	// private Component getBtnInformacion() {
	// if(btnInformacion == null){
	// btnInformacion = new JButton();
	// btnInformacion.setText(AppEtiquetasBotones.INFORMACION);
	// btnInformacion.addActionListener(new java.awt.event.ActionListener() {
	// public void actionPerformed(java.awt.event.ActionEvent evt) {
	// infoDispositivo();
	// }
	// });
	// }
	// return btnInformacion;
	// }

	private JButton getBtnCapturar() {
		if (btnCapturar == null) {
			btnCapturar = new JButton();
			btnCapturar.setEnabled(false);
			btnCapturar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					capturarImagen();
				}
			});
			btnCapturar.setText(AppEtiquetasBotones.CAPTURAR);
		}
		return btnCapturar;
	}

	private JButton getBtnCapturarSalir() {
		if (btnCapturarSalir == null) {
			btnCapturarSalir = new JButton();
			btnCapturarSalir.setEnabled(false);
			btnCapturarSalir.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					capturarImagen();
					botonSalirPresionado();
				}
			});
			btnCapturarSalir.setText(AppEtiquetasBotones.CAPTURAR_SALIR);
		}
		return btnCapturarSalir;
	}

	private JButton getBtnVer() {
		if (btnVer == null) {
			btnVer = new JButton();
			btnVer.setText(AppEtiquetasBotones.VER);
			btnVer.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent evt) {
					activarWebCam();
				}

			});
		}
		return btnVer;
	}


	protected void capturarImagen() {
		Image imagen = misDispositivos.CapturaFoto();
		if (imagen != null) {
			Foto foto = new Foto();
			if(BossConfiguracionApp.getInstance().isCapturaSimple()) imagenes.clear();
			imagenes.add(foto);
			foto.setImagen(imagen);
			foto.setEpigrafe(getTxtEpigrafe().getText());
			foto.setNroFoto(imagenes.size());
			foto.setFechaCaptura(DateUtil.getAhora());
		}
	}
	
	protected void botonSalirPresionado() {
		logger.info("Liberando Player");
		misDispositivos.liberarPlayer();
		logger.info("Armando Salida XML");
		armarSalida();
		logger.info("Finalizado Armado de Salida XML. Terminando");
	 	System.exit(0);
	}

	private void armarSalida() {
		if(imagenes.isEmpty())
			return;
		GeneradorXML pXml = new GeneradorXML();
		pXml.generaDocumentoXML();

		// Generamos documento XML para los valores anteriores
		for(Foto foto : imagenes){
			guardarImagen(foto);
			pXml.generaDocumentoXMLEmpleado(foto);
		}
		// obtenemos el documento XML en cadena de texto
		String textoXML = pXml.obtenerTextoXML();

		// grabamos en archivo el documento XML
		pXml.grabaDocumentoXML(BossConfiguracionApp.getInstance().getFullPathArchivoIntercambio(), textoXML);

		// mostramos en pantalla el documento XML grabado
		logger.info(textoXML);

	}

	private void guardarImagen(Foto foto) {
		File imagenArch = new File(foto.getFullPathArchivoImagen());
        try{
           ImageIO.write((RenderedImage) foto.getImagen(),BossConfiguracionApp.getInstance().getFormatoImagen(),imagenArch);
        }catch (IOException ioe){
        	logger.info("Error al guardar la imagen");
        }
		
	}

	/**
	 * Activa la primera camara del equipo, y setea el estado de los botones de la ventana 
	 */
	protected void activarWebCam() {
		// Por defecto siempre intenta trabajar con la primera camara instalada en el equipo. 
		misDispositivos.MuestraWebCam(jPWebCam,"vfw:Microsoft WDM Image Capture (Win32):0", "yuv");
		btnCapturar.setEnabled(true);
		btnCapturarSalir.setEnabled(true);
		btnVer.setEnabled(false);
	}
	// private void infoDispositivo()
	// {
	// txtEpigrafe.setText(misDispositivos.verInfoDispositivos());
	// }
}
